/*
 * layui的初始化模块可以理解为，引入这个模块的js文件
  * 值得注意的是：layui的模块之间存在依赖关系，例如引入了table模块，它会layui/lay/moudules/table.js
  * 这个文件引入进来，并且它还会将这个模块所依赖的其他模块自动加入进来，
  * 实际引入的模块有：table、form、jquery、layer、laypage、laytpl、util，7个js文件
  * 所以我仅仅初始化了table模块，却能获得form、jquery、layer的模块对象
 */
//layui初始化表格模组
layui.use(['table', 'tree', 'transfer'], function () {
  //获得模块对象
  var table = layui.table;
  var form = layui.form;
  var $ = layui.jquery;
  var layer = layui.layer;
  var tree = layui.tree;
  var transfer = layui.transfer;
  
  //储存所有角色
  var roleData = null;
  //发送请求查询所有角色
  $.ajax({
	  async: false,
	  url:"system/power/allRole",
	  type: "get",
	  success:function(result){
		  //查询的所有角色赋值给全局变量
		  roleData = result;
	  }
  });
  
  //数据表格渲染
  table.render({
    elem: '#userAllotRoleTable'
    ,url:'system/power/users'
    ,method: 'get'
    ,where: {} // 你额外要携带数据，以键值对的方式存入
    ,cellMinWidth: 160 // 全局定义所有常规单元格的最小宽度（默认：60）
    ,cols: [[
      {type:'numbers', fixed: 'left'} // 序号
      ,{type: 'radio', fixed: 'left'} // 复选框
      ,{field:'userName', title:'用户名'}
      ,{field:'orgName', title:'所属组织'}
    ]]
    ,page: true // 开启分页
    ,limit: 10 // 每页显示的条数
    ,limits: [5,10,20,50,100] // 每页条数的选择项
    ,loading: true // 是否显示加载条(切换分页的时候显示）
    ,id: 'userAllotRoleTable' // 设定容器唯一 id
    ,even: false // 隔行变色
  });
  
  //穿梭框渲染
  transfer.render({
    elem: "#userRoleTransfer"
    ,title: ['未拥有角色', '拥有角色'] // 标题
    ,data: roleData // 数据源
    ,id: "userRoleTransfer" // 定义唯一索引
  	,showSearch: false // 是否开启搜索
  	,width: "280px"
  	,height: "467px"
  	,parseData: function(res){ // 用于对数据源进行格式解析
  	    return {
  	      "value": res.roleId //数据值
  	      ,"title": res.roleName + " [" + res.subsetName + "]" //数据标题
  	      ,"disabled": false  //是否禁用
  	      ,"checked": false //是否选中
  	    }
    }
    //,value: roleIds // 右侧穿梭框显示的数据
  	,onchange: function(data, index){ 
  		// data:当前被穿梭的数据 index:如果数据来自左边，index 为 0，否则为 1
  	    var roleIds = [];
  	    for (let i in data) {
  	    	roleIds.push(data[i].value);
  	    }
  	    //获取当前选择的用户ID
  	    var userId = table.checkStatus('userAllotRoleTable').data[0].userId;
  	    //如果数据从右往左边走 就是要进行添加，反之
  	    var flag = index == 0 ? "insert" : "delete";
  	    //加载框
  	    layer.load(0, {shade: false});
	    //发送修改角色资源的请求 先删除角色所有的资源，再添加现有的资源
	    $.ajax({
		  async: false,
		  url:"system/power/userRole",
		  type: "post",
		  traditional: true, // 序列化参数，数组才能直接接收
		  data: {
			  _method: "PUT",
			  userId: userId,
			  roleIds: roleIds,
			  flag: flag
		  },
		  success:function(result){
			  //关闭所有的加载层
			  layer.closeAll('loading');
			  if (result == true) {
				  layer.msg("更改成功！", {icon: 1, time: 2500});
			  } else if (result == false) {
				  layer.msg("更改失败！", {icon: 1, time: 2500});
			  } else {
				  layer.msg("没有获取到用户ID为空", {icon: 1, time: 2500});
			  }
		  }
	    });
  	}
  });
  
  //搜索表单提交
  form.on('submit(userSearchBtn)', function(data){
	  //隐藏右侧穿梭框
	  $(".userRole_table_right").hide();
	  //表格重载
	  table.reload('userAllotRoleTable', {
		  where: { //设定异步数据接口的额外参数，任意设
			  userName: data.field.userName
		  }
		  ,page: {
			  curr: 1 //重新从第 1 页开始
		  }
	  });
	  return false; //阻止表单跳转。如果需要表单跳转，去掉这段即可。
  });
  
  //重置按钮点击
  $("#reset").click(function(){
	  //表格重载
	  table.reload('userAllotRoleTable', {where: null});
	  //隐藏右侧穿梭框
	  $(".userRole_table_right").hide();
  });
  
  //数据表格单选框选中事件
  table.on('radio(userAllotRoleTable)', function(obj){
	  //显示右侧的穿梭框
	  $(".userRole_table_right").show();
	  //查询用户拥有角色
	  var roleIds = findUserHasRoleId(obj.data.userId);
	  //穿梭框重载
	  transfer.reload('userRoleTransfer', {
		  data: roleData, // 数据源
		  value: roleIds // 右侧穿梭框显示的数据
	  });
  });
  
});

/*
 *	根据用户ID查询改用户拥有的角色
 */
function findUserHasRoleId(userId) {
	  //某个角色所拥有的资源ID数组
	  let roleIds = [];
	  //请求后台，根据角色ID查询资源ID
	  $.ajax({
		async: false,
		url:"system/power/userHasRoleId?userId="+userId,
		type: "get",
		success:function(result){
			//先清空一次资源数组
			roleIds.length = 0;
			//将查询到的资源ID加入资源ID数组
			for (let i in result) {
				roleIds.push(result[i]);
		    }
		}
	  });
	  return roleIds;
}

